<?php
/**
 * 通用工具类
 */

namespace App\Utils;

use App\Code;
use App\Message;
use Dcat\Admin\Admin;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\File;
use Exception;

class Utils
{
    private static $instance = null;

    public static function getSingleton()
    {
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    //api 返回格式
    public static function ret($code = null, $message = null, $data = null)
    {
        $code = $code ?? Code::FAIL;
        $message = $message ?? Message::NAME[Code::FAIL];
        $data = $data ?? [];

        return response()->json(
            [
                'code' => $code,
                'message' => $message,
                'data' => $data,
            ]
        );
    }

    //后端UI 验证提示
    public static function tips(
        $status,
        $message,
        $type
    ) {
        return response()->json(['status' => $status, 'data' => ['message' => $message, 'type' => $type]]);
    }

    //双击数据表格的行直接唤起编辑
    public static function doubleClickQuickEdit()
    {
        $script = <<<JS
      $("#grid-table > tbody > tr").on("dblclick",function() {
         var obj = $(this).find(".feather.icon-edit");
         if (obj.length == 1) {
             obj.trigger("click")
         }
      })
JS;
        Admin::script($script);
    }

    /**@desc 加密
     * @param $Secret
     * @return string
     */
    public static function encryption(
        $secret
    ) {
        return Crypt::encryptString($secret);
    }

    /**
     * @desc 解密
     * @param $Secret
     */
    public static function deciphering(
        $encryptedValue
    ) {
        try {
            return Crypt::decryptString($encryptedValue);
        } catch (Exception $e) {
            return $e;
        }
    }

    /**
     * 资源组件
     */
    public static function adminAsset()
    {
        Admin::asset()->alias('@luckysheet', [
            'js' => [
                'libs/luckysheet/plugins/js/plugin.js?t='.time(),
                'libs/luckysheet/luckysheet.umd.js?t='.time(),
            ],
            'css' => [
                'libs/luckysheet/plugins/css/pluginsCss.css',
                'libs/luckysheet/plugins/plugins.css',
                'libs/luckysheet/css/luckysheet.css',
                'libs/luckysheet/assets/iconfont/iconfont.css',
            ],
        ]);
        //Admin::js('js/http.js');
    }

    /**
     * @desc 上传文件
     * @param $fieldName 文件提交字段名称
     * @param  array|string[]  $extensions  允许的后缀
     * @param  string  $path  上传路径(根目录除外)
     * @return array|\Illuminate\Http\JsonResponse
     */
    public static function upload(
        $request,
        $fieldName,
        array $extensions = ["xlsx"],
        $path = '/storage/app/public/uploads/template/temp/',
        $fileName = ''
    ) {
        if ($request->hasFile($fieldName) && $request->file($fieldName)->isValid()) {
            $file = $request->file($fieldName);
            $allowed_extensions = $extensions;
            if (!in_array($file->getClientOriginalExtension(), $allowed_extensions)) {
                return ['status' => false, 'msg' => '文件格式错误,只能是xlsx格式', 'filePath' => ''];
            } else {
                //$destinationPath = storage_path().$path; //public 文件夹下面建 storage/uploads 文件夹
                $destinationPath = base_path().$path; //public 文件夹下面建 storage/uploads 文件夹
                File::isDirectory($path) or File::makeDirectory($path, 0777, true, true);
                $extension = $file->getClientOriginalExtension();
                $fileName = $fileName.'.'.$extension;
                $file->move($destinationPath, $fileName);
                //$filePath = asset($destinationPath.$fileName);//带域名
                $filePath = $destinationPath.$fileName;//绝对路径

                return ['status' => true, 'msg' => '上传成功', 'filePath' => $filePath];
            }
        } else {
            return ['status' => false, 'msg' => '文件错误,请重新选择!', 'filePath' => ''];
        }
    }

    public static function getSheetCell($data)
    {
        $cell = [];
        if (empty($data)) {
            return null;
        }
        foreach ($data as $item) {
            $cell[] = self::getSingleton()->renderCell($item['row'], $item['column'], $item['v'], $item['m'],
                $item['rs'],
                $item['cs'],
                $item['bl'], $item['fs']);
        }

        return $cell;
    }

    public function renderCell(
        $row,
        $column,
        $v = '',
        $m = '',
        $rs = 0,
        $cs = 0,
        $bl = 0,
        $fs = 12,
        $ctFa = 'General',
        $ctT = 'g',
        $ff = 4,
        $bg = '#fff',
        $fc = '#000',
        $vt = 0,
        $ht = 0,
        $tb = 2
    ) {
        if ($rs) {
            $cell = [
                'r' => $row,
                'c' => $column,
                'v' => [
                    'ct' => [
                        "fa" => $ctFa, "t" => $ctT,
                    ],
                    "v" => $v,//原始值
                    "m" => $m,//显示值
                    'bg' => $bg,
                    'ff' => $ff,
                    //字体 0 Times New Roman、 1 Arial、2 Tahoma 、3 Verdana、4 微软雅黑、5 宋体（Song）、6 黑体（ST Heiti）、7 楷体（ST Kaiti）、 8 仿宋（ST FangSong）、9 新宋体（ST Song）、10 华文新魏、11 华文行楷、12 华文隶书
                    'fc' => $fc,//字体颜色
                    'bl' => $bl,//0 常规 、 1加粗
                    'it' => 0,//0 常规 、 1 斜体
                    'fs' => $fs,//字体大小
                    'cl' => 0,//0 常规 、 1 删除线
                    'vt' => $vt,//0 中间、1 上、2下
                    'ht' => $ht,//0 居中、1 左、2右
                    'tr' => 2,//竖排文字	3,2横排文字
                    'rt' => 0,//介于0~180之间的整数，包含0和180
                    'tb' => $tb,//文本换行	0 截断、1溢出、2 自动换行
                    'mc' => [
                        "r" => $row,//主单元格的行号
                        "c" => $column,//主单元格的列号
                        "rs" => $rs,//合并单元格占的行数
                        "cs" => $cs,//合并单元格占的列数
                    ],// mergecell	合并单元格
                    'f' => '',
                    /*'ps' => '{
                            height: 140,//批注框高度
                            width: 73,//批注框宽度
                            left: 75,//批注框距离左边工作表边缘位置
                            top: 22,//批注框距离上边工作表边缘位置
                            isshow: true,//是否显示批注
                            value: "jhbk"//批注内容
                     }',*/
                ],
            ];
        } else {
            $cell = [
                'r' => $row,
                'c' => $column,
                'v' => [
                    'ct' => [
                        "fa" => "General", "t" => "g",
                    ],
                    "v" => $v,//原始值
                    "m" => $m,//显示值
                    'bg' => $bg,
                    'ff' => $ff,
                    //字体 0 Times New Roman、 1 Arial、2 Tahoma 、3 Verdana、4 微软雅黑、5 宋体（Song）、6 黑体（ST Heiti）、7 楷体（ST Kaiti）、 8 仿宋（ST FangSong）、9 新宋体（ST Song）、10 华文新魏、11 华文行楷、12 华文隶书
                    'fc' => $fc,//字体颜色
                    'bl' => $bl,//0 常规 、 1加粗
                    'it' => 0,//0 常规 、 1 斜体
                    'fs' => $fs,//字体大小
                    'cl' => 0,//0 常规 、 1 删除线
                    'vt' => $vt,//0 中间、1 上、2下
                    'ht' => $ht,//0 居中、1 左、2右
                    'tr' => 2,//竖排文字	3,2横排文字
                    'rt' => 0,//介于0~180之间的整数，包含0和180
                    'tb' => $tb,//文本换行	0 截断、1溢出、2 自动换行
                    //'mc'=>'',// mergecell	合并单元格
                    'f' => '',
                    /*'ps' => '{
                            height: 140,//批注框高度
                            width: 73,//批注框宽度
                            left: 75,//批注框距离左边工作表边缘位置
                            top: 22,//批注框距离上边工作表边缘位置
                            isshow: true,//是否显示批注
                            value: "jhbk"//批注内容
                     }',*/
                ],
            ];
        }

        return $cell;
    }

    //生成单元格
    public static function makeCell(
        $row,
        $column,
        $v = '',
        $m = '',
        $rs = 0,
        $cs = 0,
        $bl = 0,
        $fs = 12,
        $ctFa = 'General',
        $ctT = 'g',
        $ff = 4,
        $bg = '#fff',
        $fc = '#000',
        $vt = 0,
        $ht = 0
    ) {
        if ($rs) {
            $cell = [
                'r' => $row,
                'c' => $column,
                'v' => [
                    'ct' => [
                        "fa" => $ctFa, "t" => $ctT,
                    ],
                    "v" => $v,//原始值
                    "m" => $m,//显示值
                    'bg' => $bg,
                    'ff' => $ff,
                    //字体 0 Times New Roman、 1 Arial、2 Tahoma 、3 Verdana、4 微软雅黑、5 宋体（Song）、6 黑体（ST Heiti）、7 楷体（ST Kaiti）、 8 仿宋（ST FangSong）、9 新宋体（ST Song）、10 华文新魏、11 华文行楷、12 华文隶书
                    'fc' => $fc,//字体颜色
                    'bl' => $bl,//0 常规 、 1加粗
                    'it' => 0,//0 常规 、 1 斜体
                    'fs' => $fs,//字体大小
                    'cl' => 0,//0 常规 、 1 删除线
                    'vt' => $vt,//0 中间、1 上、2下
                    'ht' => $ht,//0 居中、1 左、2右
                    'tr' => 2,//竖排文字	3,2横排文字
                    'rt' => 0,//介于0~180之间的整数，包含0和180
                    'tb' => 2,//文本换行	0 截断、1溢出、2 自动换行
                    'mc' => [
                        "r" => $row,//主单元格的行号
                        "c" => $column,//主单元格的列号
                        "rs" => $rs,//合并单元格占的行数
                        "cs" => $cs,//合并单元格占的列数
                    ],// mergecell	合并单元格
                    'f' => '',
                    /*'ps' => '{
                            height: 140,//批注框高度
                            width: 73,//批注框宽度
                            left: 75,//批注框距离左边工作表边缘位置
                            top: 22,//批注框距离上边工作表边缘位置
                            isshow: true,//是否显示批注
                            value: "jhbk"//批注内容
                     }',*/
                ],
            ];
        } else {
            $cell = [
                'r' => $row,
                'c' => $column,
                'v' => [
                    'ct' => [
                        "fa" => "General", "t" => "g",
                    ],
                    "v" => $v,//原始值
                    "m" => $m,//显示值
                    'bg' => $bg,
                    'ff' => $ff,
                    //字体 0 Times New Roman、 1 Arial、2 Tahoma 、3 Verdana、4 微软雅黑、5 宋体（Song）、6 黑体（ST Heiti）、7 楷体（ST Kaiti）、 8 仿宋（ST FangSong）、9 新宋体（ST Song）、10 华文新魏、11 华文行楷、12 华文隶书
                    'fc' => $fc,//字体颜色
                    'bl' => $bl,//0 常规 、 1加粗
                    'it' => 0,//0 常规 、 1 斜体
                    'fs' => $fs,//字体大小
                    'cl' => 0,//0 常规 、 1 删除线
                    'vt' => $vt,//0 中间、1 上、2下
                    'ht' => $ht,//0 居中、1 左、2右
                    'tr' => 2,//竖排文字	3,2横排文字
                    'rt' => 0,//介于0~180之间的整数，包含0和180
                    'tb' => 2,//文本换行	0 截断、1溢出、2 自动换行
                    //'mc'=>'',// mergecell	合并单元格
                    'f' => '',
                    /*'ps' => '{
                            height: 140,//批注框高度
                            width: 73,//批注框宽度
                            left: 75,//批注框距离左边工作表边缘位置
                            top: 22,//批注框距离上边工作表边缘位置
                            isshow: true,//是否显示批注
                            value: "jhbk"//批注内容
                     }',*/
                ],
            ];
        }

        return $cell;
    }

    public static function borderInfo($row_index, $col_index)
    {
        return [
            'rangeType' => 'cell',
            'value' => [
                'row_index' => $row_index,
                'col_index' => $col_index,
                'l' => ['style' => 1, 'color' => 'rgb(0, 0, 0)'],
                'r' => ['style' => 1, 'color' => 'rgb(0, 0, 0)'],
                't' => ['style' => 1, 'color' => 'rgb(0, 0, 0)'],
                'b' => ['style' => 1, 'color' => 'rgb(0, 0, 0)'],
            ],
        ];
    }

    //获取合并单元格设置
    public static function getMergeCell($row, $column, $rs = 0, $cs = 0)
    {
        $key = $row.'_'.$column;
        $v = [
            'r' => $row,
            'c' => $column,
            'rs' => $rs,
            'cs' => $cs,
        ];

        return ['key' => $key, 'v' => $v];
    }
}
